﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace Autoverwaltung.TUI
{
    public class AnsichtManager : IAnsichtManager, Fachkonzept.IUserInterface
    {
        private Ansicht aktuelleAnsicht;
        public Ansicht AktuelleAnsicht
        {
            get { return this.aktuelleAnsicht; }
            private set
            {
                this.aktuelleAnsicht = value;

                this.ConsoleLeeren();

                value.ZeigeUeberschrift();
                value.ZeigeMenue();
            }
        }

        public Fachkonzept.IFachkonzept Fachkonzept
        {
            get
            {
                return Autoverwaltung.Fachkonzept.Fachkonzept.GetInstance(this);
            }
        }

        private void ZeigeKopf()
        {
            Console.WriteLine("########################################");
            Console.WriteLine("#                                      #");
            Console.WriteLine("#            Autoverwaltung            #");
            Console.WriteLine("#                                      #");
            Console.WriteLine("########################################");
            Console.WriteLine("\n\n");
        }

        public AnsichtManager()
        {
            this.WechselAnsicht(Ansichten.Hauptmenue);
        }

        public void WechselAnsicht(Ansichten ansicht)
        {
            switch (ansicht)
            {
                case Ansichten.Hauptmenue:
                    this.AktuelleAnsicht = new Hauptmenue(this);
                    break;

                case Ansichten.HerstellerVerwaltung:
                    this.AktuelleAnsicht = new HerstellerVerwaltung(this);
                    break;

                case Ansichten.ModellVerwaltung:
                    this.AktuelleAnsicht = new ModellVerwatung(this);
                    break;

                case Ansichten.AutoVerwaltung:
                    this.AktuelleAnsicht = new AutoVerwaltung(this);
                    break;
            }
        }

        public void BeendeProgramm()
        {
            Environment.Exit(0);
        }

        public void ConsoleLeeren()
        {
            Console.Clear();
            ZeigeKopf();
        }

        public ConsoleKey EinfacheTastenEingabe(string nachricht = "Waehlen Sie bitte eine Aktion aus:", bool istZeichenSichtbar = false)
        {
            this.ZeigeNachricht(nachricht);
            return Console.ReadKey(istZeichenSichtbar).Key;
        }

        public void DisplayException(Exception ex)
        {
            Console.WriteLine("\n\n-----------------------------------------\n\n");
            Console.WriteLine("Es ist ein Fehler aufgetreten:\n");
            Console.WriteLine(ex.Message);
            Console.WriteLine("\n\n-----------------------------------------\n\n");
        }

        public decimal ZahlenEingabe(string nachricht)
        {
            this.ZeigeNachricht(nachricht);
            string line = Console.ReadLine();
            decimal number = 0;
            try
            {
              number = decimal.Parse(line.Replace(',', '.'), CultureInfo.InvariantCulture); 
            }
            catch
            {
              this.ZahlenEingabe(nachricht);
            }
            return number;
        }

        public string EinfacheTextEingabe(string nachricht)
        {
            this.ZeigeNachricht(nachricht);
            return Console.ReadLine();
        }

        private void ZeigeNachricht(string nachricht)
        {
            Console.WriteLine("\n\n" + nachricht);
        }


        public bool JaNeinFrage(string frage)
        {
            switch (this.EinfacheTastenEingabe(frage + " - (j/n)"))
            {
                case ConsoleKey.J:
                    return true;

                case ConsoleKey.N:
                    return false;

                default:
                    return this.JaNeinFrage(frage);
            }
        }
    }
}
